// SPDX-FileCopyrightText: 2022 Demerzel Solutions Limited
// SPDX-License-Identifier: LGPL-3.0-only

namespace Nethermind.Evm.Precompiles.Bls;

/// <summary>
/// https://eips.ethereum.org/EIPS/eip-2537
/// </summary>
internal static class Discount
{
    public static int ForG1(int k) => k >= 128 ? _maxDiscountG1 : _discountTable[k].g1;
    public static int ForG2(int k) => k >= 128 ? _maxDiscountG2 : _discountTable[k].g2;

    private const int _maxDiscountG1 = 519;
    private const int _maxDiscountG2 = 524;

    private static readonly (int g1, int g2)[] _discountTable =
    {
        (0, 0), // 0
        (1000, 1000), // 1
        (949, 1000), // 2
        (848, 923), // 3
        (797, 884), // 4
        (764, 855), // 5
        (750, 832), // 6
        (738, 812), // 7
        (728, 796), // 8
        (719, 782), // 9
        (712, 770), // 10
        (705, 759), // 11
        (698, 749), // 12
        (692, 740), // 13
        (687, 732), // 14
        (682, 724), // 15
        (677, 717), // 16
        (673, 711), // 17
        (669, 704), // 18
        (665, 699), // 19
        (661, 693), // 20
        (658, 688), // 21
        (654, 683), // 22
        (651, 679), // 23
        (648, 674), // 24
        (645, 670), // 25
        (642, 666), // 26
        (640, 663), // 27
        (637, 659), // 28
        (635, 655), // 29
        (632, 652), // 30
        (630, 649), // 31
        (627, 646), // 32
        (625, 643), // 33
        (623, 640), // 34
        (621, 637), // 35
        (619, 634), // 36
        (617, 632), // 37
        (615, 629), // 38
        (613, 627), // 39
        (611, 624), // 40
        (609, 622), // 41
        (608, 620), // 42
        (606, 618), // 43
        (604, 615), // 44
        (603, 613), // 45
        (601, 611), // 46
        (599, 609), // 47
        (598, 607), // 48
        (596, 606), // 49
        (595, 604), // 50
        (593, 602), // 51
        (592, 600), // 52
        (591, 598), // 53
        (589, 597), // 54
        (588, 595), // 55
        (586, 593), // 56
        (585, 592), // 57
        (584, 590), // 58
        (582, 589), // 59
        (581, 587), // 60
        (580, 586), // 61
        (579, 584), // 62
        (577, 583), // 63
        (576, 582), // 64
        (575, 580), // 65
        (574, 579), // 66
        (573, 578), // 67
        (572, 576), // 68
        (570, 575), // 69
        (569, 574), // 70
        (568, 573), // 71
        (567, 571), // 72
        (566, 570), // 73
        (565, 569), // 74
        (564, 568), // 75
        (563, 567), // 76
        (562, 566), // 77
        (561, 565), // 78
        (560, 563), // 79
        (559, 562), // 80
        (558, 561), // 81
        (557, 560), // 82
        (556, 559), // 83
        (555, 558), // 84
        (554, 557), // 85
        (553, 556), // 86
        (552, 555), // 87
        (551, 554), // 88
        (550, 553), // 89
        (549, 552), // 90
        (548, 552), // 91
        (547, 551), // 92
        (547, 550), // 93
        (546, 549), // 94
        (545, 548), // 95
        (544, 547), // 96
        (543, 546), // 97
        (542, 545), // 98
        (541, 545), // 99
        (540, 544), // 100
        (540, 543), // 101
        (539, 542), // 102
        (538, 541), // 103
        (537, 541), // 104
        (536, 540), // 105
        (536, 539), // 106
        (535, 538), // 107
        (534, 537), // 108
        (533, 537), // 109
        (532, 536), // 110
        (532, 535), // 111
        (531, 535), // 112
        (530, 534), // 113
        (529, 533), // 114
        (528, 532), // 115
        (528, 532), // 116
        (527, 531), // 117
        (526, 530), // 118
        (525, 530), // 119
        (525, 529), // 120
        (524, 528), // 121
        (523, 528), // 122
        (522, 527), // 123
        (522, 526), // 124
        (521, 526), // 125
        (520, 525), // 126
        (520, 524), // 127
        (519, 524) // 128
    };
}
